package com.manda.smart.hub.common.lambda;

import cn.hutool.core.util.ReflectUtil;

import java.io.Serializable;
import java.lang.invoke.SerializedLambda;
import java.util.Objects;

/**
 * @author hongda.li
 */
public final class SerializableLambdaParser {
    /**
     * Lambda 序列化的方法名称
     */
    private static final String METHOD_NAME = "writeReplace";

    private SerializableLambdaParser() {
    }

    /**
     * 解析 Lambda 表达式的方法名称
     *
     * @param lambda Lambda 表达式
     * @return 方法名称
     */
    public static String parseMethodName(Serializable lambda) {
        SerializedLambda serializedLambda = SerializableLambdaParser.parse(lambda);
        Objects.requireNonNull(serializedLambda);
        return serializedLambda.getImplMethodName();
    }

    /**
     * 解析 Lambda 表达式的序列化实例
     *
     * @param lambda Lambda 表达式
     * @return 序列化实例
     */
    public static SerializedLambda parse(Serializable lambda) {
        return ReflectUtil.invoke(lambda, METHOD_NAME);
    }
}
